// 负责数据劫持
// 把$data中的成员转换成getter/setter
class Observer {
    constructor (data){
      this.walk(data)
    }
    // 判断数据是否是对象，如果不是就返回
    // 如果是对象，遍历对象的所有属性，转换成getter/setter
    walk(data){
       if(!data || typeof data !== 'object'){
           return 
       }
       //遍历data所有成员
       Object.keys(data).forEach((key)=>{
          this.defineReactive(data,key,data[key])
       })
    }
    // 定义响应式成员
    defineReactive(data,key,val){
       let that = this
       //  负责收集依赖，并发送通知
       let dep = new Dep()
        // 如果val是对象继续设置下面的属性为响应式
       that.walk(val)
       Object.defineProperty(data,key,{
           enumerable:true,
           configurable:true,
           get(){
            //    收集依赖
              Dep.target && dep.addSub(Dep.target)
               return val
           },
           set(newValue){
               if(val === newValue){
                   return 
               }
            //    如果newValue是对象继续设置newValue的成员为响应式
               val = newValue
               that.walk(val)
            //    发送通知
            dep.notify()
           }
       })
    }
}